
\chapter{前言}
	2017年9月我开始上《计算物理》这门课，我想每1到2年更新一次这个讲义，一方面可以不断向学生靠拢，希望让学生感到有意思，另一方面也可以逐渐增加我感兴趣的内容。

\paragraph{为什么要学计算物理}
	在物理学的研究中，计算早已是不可或缺了。
    有的人把理论、计算、实验看作是三足鼎立的关系。
    而有的人更倾向于认为，计算是理论的延伸。
    无论如何，现在的物理学研究中的问题越来越复杂，用铅笔和草稿纸就能解决的问题似乎越来越稀少了。
    不仅是计算的复杂性，有时候，我们凭借物理直觉对物理问题进行抽象，最大程度地简化和理想化以后，仍然无法得到解析公式，但可能得到无比简单的模型。
    即使4行文字就可以定义这个模型，但这个模型的结果却无法预测，只能靠计算机进行多次操作，最终统计结果，印证最初的物理直觉。
    我指的是自组织临界现象中的沙堆模型\cite{Bak1996How}.

    曲师大本科生大多是师范生，本科阶段不仅需要修读四大力学等等物理课程，还需要修读教学论等课程，所以选修《计算物理》这门课程的人很少。
    但我们的学生考研率非常高，每年约有四五十名学生进入国内211、985或双一流高校继续学习，进入研究生阶段以后，他们往往会需要一些计算物理的知识。
    另外，本科生做毕业设计时，也常常需要一些计算物理知识。
    所以，这个讲义也许对我们的本科生也有些帮助。

   	我自己本科的时候，有幸在交大听过张海燕老师的《计算物理导论》，硕士的时候听过马红儒老师的《计算物理》。
 	本科的时候，一台二手台式机对我来说都挺贵的，而且我也没有好好学习，所以学的不好，愧对马老师夫妇。
 	后来做科研，编写程序，便经常痛苦地感慨，“我没有受过很好的编程训练”，仿佛荒废学业不是我自己的错似的。
 	再后来遇到具体问题了，只好自己慢慢摸索，看书和分析，到网上搜索相似的问题，看别人讨论。
 	实际上，直到现在，我也不敢说我的程序写的很好了，我离“很秀”还很远。
 	我只能说，如果在研究中有什么想法，我基本上能用程序实现，并且能做一些简单的性能分析。
 	如今上这门课，我希望尽量呈现出计算物理的乐趣，我觉得如果能传递乐趣，就是成功的老师了。
 	如果没有乐趣，我这个讲义也写不下去，人做有趣的事，就会不由自主地干下去。。。

\paragraph{编程语言}	
	当然，有些麻烦是跳不过去的。
	写程序都需要熟悉一门语言。
	c/c++ 和 fortran，离机器更近，离人更远，编译以后，机器运行的效率更高。
	也有一些对人类非常友好的语言，包括 matlab, mathematica, maple，还有 python 等等，编译出来得到的可执行文件，跑得慢几倍，但是有很多封装的函数，可以供人直接调用。
	我觉得用 c 或者 c++ 学习这门课更好；一方面，本科阶段大家都修过 c 语言或者 c++ （二者很相似，有人说，c++就是带类的c)，有一定基础；另一方面，计算物理要教给人的是处理问题的思想方法，而不是 matlab 或者 mathematica 的使用手册。
	使用手册是很容易百度到的，耐心读读手册，就能找到你要的功能。。。
	
	用 c/c++ 或者 fortran 写一遍《计算物理》里的内容，会对里面介绍的算法具有非常感性的认识，不仅能用，而且能理解为什么那些算法管用，对不同算法的性能优劣也有一定的了解。
	而用 matlab、mathematica 或者 python 的一些库函数，来做同样的事，你能学会的只是调用，你不会理解为什么那些函数管用，也不理解为什么有时候不管用（尤其后者是很让人头疼的）。
	
	当然，自己写一遍这些算法，其代价就是需要花时间。
	你将会有很多时刻，诅咒一切，飙脏话，因为程序编译不通过。。。
	而编译通过，输出正确结果的时刻，你会得到喜悦和成就感的奖赏。
	
	如果你逐渐熟悉了写代码这种工作方式，也会有各种各样的好处。
	比如，
	\begin{itemize}
	\item 我们可以介绍简单的并行工具 openmp 和 openmpi，你可以将程序并行以后，提交到计算中心，体验多处理器并行处理的力量感。
	\item 我们可以简单地介绍gnuplot画图工具，让电脑自动画图，生成图片，或者自动生成 latex 编码，并教你用 latex 命令自动调用这些图片，生成图文并茂的 pdf 文件。
	\item 作为课程的福利，我们会讲解，怎样通过几行命令，让电脑定期给好友发送“生日快乐”的邮件。。。
	这样的小技巧，对谈恋爱也许会有帮助吧。。。
	\end{itemize}

	在开始课程之前，我建议大家考虑以下几条忠告：
	\begin{itemize}
		\item {\bf 在动手写程序之前，要完全搞清楚一个算法，以及程序的大致流程。}
		我自己犯过这个错误不止一次，如果没有完全搞清楚算法，写到一半的时候，可能会发现行不通，或者前面写的都要改，那就很头疼了。。。
		\item {\bf 写程序要注意层次，多写注释。}
		层次主要是靠缩进体现的，如果没有层次，没有注释，可能过两周，就会感到茫然，并拷问自己的灵魂：“我都写了些什么？”
		最好是注意层次（缩进），并在程序中稍微多写一点注释，并且在程序开头，或者同一个文件夹中的"ReadMe"文件中写下程序的使用方法，甚至加上使用例子。
		这样，下次使用时，你会非常感激两周前的自己。
		\item{\bf 变量名、函数名尽量用有意义的名字}
		如果你的变量名叫做 $x1, x2, x3$，分别代表温度、气压、玻尔兹曼常数等等，你很可能会犯错误，而且难以找到错误。。。
		不如叫做 T, P, kb，这样来的实在。
		\item 写程序是个耐心活，需要静下心来照顾好细节，不用焦虑，
		一天写几十行高效有用的程序，就不错了。
	\end{itemize}

\paragraph{课程预备知识}
	本课程预期同学们熟悉高等数学、线性代数、概率论。
	显然大家都很熟悉这些基础数学，我们用的内容也不艰深，无非是泰勒展开、矩阵相似变换、概率分布函数这些童叟皆知的知识。。。
	
    我预期同学们修过c或者 c++，但我不做很多指望，我们会回顾c++最基础的一点内容，然后期望大家课下花些时间熟悉。
	
	当然，熟悉我们计算的一些物理系统，会很有帮助。
	我们将会求解一些简单的量子系统，包括谐振子、氢原子，如果还记得一些《量子力学》会更有感觉。
	我们会讲解最简单的统计模型：Ising 模型，并用 Monte Carlo 方法模拟这个模型，如果还记得一点《热力学与数理统计》中的正则分布，会更理解这些技巧的目的。。。
	我们会求解单摆、受迫振动，也许会讲解，怎样用数值的格林函数法求解微分方程，也可能编写一点特殊函数，所以熟悉《数学物理方法》中的内容，会很得心应手。
	如果完全不记得，讲到的时候再把那些书翻一翻，也会有助于理解。。。
	
\paragraph{课程内容}
	课程内容分为以下几部分，每个部分包括几章内容
	\begin{itemize}
		\item[1] c++ 以及一些计算工具的介绍
		\item [2] 常用数值技巧：函数极值、微分、积分、方程求根、拟合与插值等
		\item [3] 微分方程：常微分方程、偏微分方程的一系列数值解法
		\item [4] 数值线性代数：线性方程组、矩阵变换、以及本征值系统
		\item [5] 蒙特卡洛方法: metropolis 方法
	\end{itemize}
	因为课时有限，我们可能略过上面列出的少量内容，也可能增添一点内容，因为任课老师有时会对一些特定内容很感兴趣。。。
	
\paragraph{课程政策}
	
	本课程每周布置一次作业，每次作业 1 到 2 题，需要编写程序，并在指定期限内向课程邮箱提交作业，由助教和任课老师批改，并回复邮件。
	
	敬请重视这些平时作业，平时作业占据总成绩的 40\% （考勤只占10\%，期末占据50\%）。
	平时作业有如下相关政策
	\begin{itemize}
		\item 如果平时成绩缺 1/3 以上，取消期末考试资格。
		\item 如果有一次平时作业确认为抄袭，取消期末考试资格。
		\item 超过指定期限的作业，将不予批阅。
		\item 同一次作业可以提交多份，我们只批改指定期限前提交的最后一份。
	\end{itemize}
	
	我们要求每份作业都说明：
	\begin{itemize}
		\item [1] 这个程序是做什么的
		\item [2] 怎样跑这个程序
		\item [3] 预期得到什么样的结果
	\end{itemize}
	这个说明可以作为注释，写在代码文件的开头，也可以作为一个独立 txt 文件交上来。
	如果经过一番努力，没有解决问题，也可以提交未成功的代码，在说明文字中总结所做的努力、观察到的现象、还存在的问题。
	如果没有说明文档，只有一些犬牙参差的代码和谜一样的变量名、函数名，而且还跑不通，我可能会表示我视力不好，什么都没看见：“哪里有作业，根本没有。”
	
	根据前面两届的数据，期末考试的成绩与平时成绩的得分正相关，并且相关性非常好，好像没有遇到过例外。
	期末考试将采取现场编程的考试方式。
	所以平时不动手编程的话，期末就自求多福吧。。。

\paragraph{计算的智慧}
我们应该用什么样的心态，去从事计算？
什么样的智慧，是属于计算这一种工作的？
显然，计算不是为了显摆我会编程，我们并不是计算机出身，编程比我们好的人多了去了。
写几千行代码，也不是最值得夸耀的事。。。
计算也不仅是为了体验工具带来的快感，虽然好机器使我们有快感，但每天产生一百万个陌生的数字、让机器嗡嗡叫，未必使我们幸福。。。

真正使人了不起的，是人的洞察力。。。
实现了算法，能说明我们的程序有了效力，但只有我们的心智能够把握了算法时，我们才真正感到更自由。。。
我们会理解，它巧妙在哪里，适用于什么样的问题。
碰到物理问题时，我们才能饶有兴致地想到，一种算法的恰如其分的应用。
我们甚至能在问题还未发生时，在那硕大的Enter键还没有被按下时，就预见到问题。
我们也能明白，机器给出的几百万个数，说明的实际上是一个简单的道理，这个道理仅存在于我们的头脑中，将由数据画成的图表所印证。。。

使我们接近智慧的，是我们分析问题的能力。
上帝给我们的最宝贵的东西，不是 i7 的 cpu，而是拥有理性的灵魂。
